spin_lock(&console_lock);
}
+void console_putc(char c)
+{
+ serial_putc(sercon_handle, c);
+}
+
+int console_getc(void)
+{
+ return serial_getc(sercon_handle);
+}
+
+int irq_console_getc(void)
+{
+ return irq_serial_getc(sercon_handle);
+}
+
/*
* **************************************************************
return 0;
}
-unsigned char serial_getc(int handle)
+unsigned char irq_serial_getc(int handle)
{
uart_t *uart = &com[handle & SERHND_IDX];
unsigned char c;
- unsigned long flags;
-
- spin_lock_irqsave(&uart->lock, flags);
while ( uart->rxbufp != uart->rxbufc )
{
goto out;
}
- disable_irq(uart->irq);
-
- /* disable_irq() may have raced execution of uart_rx(). */
- while ( uart->rxbufp != uart->rxbufc )
- {
- c = uart->rxbuf[MASK_RXBUF_IDX(uart->rxbufc++)];
- if ( byte_matches(handle, &c) )
- goto enable_and_out;
- }
-
/* We now wait for the UART to receive a suitable character. */
do {
while ( (inb(uart->io_base + LSR) & LSR_DR) == 0 )
}
while ( !byte_matches(handle, &c) );
- enable_and_out:
+ out:
+ return c;
+}
+
+unsigned char serial_getc(int handle)
+{
+ uart_t *uart = &com[handle & SERHND_IDX];
+ unsigned char c;
+ unsigned long flags;
+
+ spin_lock_irqsave(&uart->lock, flags);
+
+ while ( uart->rxbufp != uart->rxbufc )
+ {
+ c = uart->rxbuf[MASK_RXBUF_IDX(uart->rxbufc++)];
+ if ( byte_matches(handle, &c) )
+ goto out;
+ }
+
+ disable_irq(uart->irq);
+
+ c = irq_serial_getc(handle);
+
enable_irq(uart->irq);
out:
spin_unlock_irqrestore(&uart->lock, flags);
* will not return until a character is available. It can safely be
* called with interrupts disabled.
*/
+unsigned char irq_serial_getc(int handle);
unsigned char serial_getc(int handle);
void serial_force_unlock(int handle);